package com.ribbon.custom;

import com.alibaba.nacos.client.naming.utils.ThreadLocalRandom;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;

import java.util.List;

/**
 * 自定义负载均衡策略实现：
 * 关键点：
 * 1、继承 AbstractLoadBalancerRule基类，重写 choose方法(服务选择)
 * 2、使用配置文件 配置当前实现类路径 com.ribbon.custom.RibbonCustomRule
 *    或者 使用代码配置实现(详见RibbonRandomRuleConfig，为当前RibbonCustomRule创建实例)
 */
public class RibbonCustomRule extends AbstractLoadBalancerRule {

    /**
     * 简单实现
     */
    @Override
    public Server choose(Object o) {
        // 获取当前负载均衡器
        ILoadBalancer loadBalancer = this.getLoadBalancer();
        // 获取已启动 且 可访问的服务
        List<Server> reachableServers = loadBalancer.getReachableServers();
        // 使用随机数
        int i = ThreadLocalRandom.current().nextInt(reachableServers.size());
        // 获得随机服务返回
        return reachableServers.get(i);
    }

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }

}
